在上一篇的練習題中,我們寫了一個猜數字遊戲,但是祕密數字是寫死的(俗稱哈扣 Hardcode)。如果能隨機產生數字,會使這個遊戲更具有挑戰性。這時可以借助 random
套件來執行:
>>> import random
>>> random.randint(1, 99)
18
可以嘗試多執行幾次,會發現每次結果都不一樣。這裡用到 import
關鍵字,這是用來要求程式匯入某個套件的語法。什麼是套件呢?套件就是別人寫好的程式,並包裝成函式,方便開發者重複利用,減輕大家重造輪子的工作。
在這裡匯入的是 Python 內建的 random
套件,是個專門用來處理與隨機性相關的套件。透過 random.randint()
的方式,可以調用 random
套件裡面的 randint()
函式,代表隨機產生一個整數的意思。
因為這是官方的套件,所以在官方網站有非常詳細的說明文件。
傳入 randint()
函式的第一個參數是隨機數可能的最小值,第二個是可能的最大值,因此 random.randint(1, 99)
代表產生一個 1 到 99 之間的隨機數,包含 1 跟 99。
除了產生整數以外,還有 random.random()
這個函式,不需要任何參數,會產生一個介在 0 到 1 之間的浮點數:
>>> random.random()
0.5692038748222122
如果想要產生的浮點數範圍不在 0 到 1 之間,可以使用 random.uniform()
並帶入兩個參數來指定範圍:
for i in range(5):
print(random.uniform(3.141, 9.487))
8.232174078173292
3.5414758916994034
3.8893120934965535
7.970067675415205
6.137868315734036
在機器學習的實驗中,很注重實驗的結果是否能被重現,但若是程式涉及隨機性,那該怎麼重現呢?事實上,在程式裡面隨機數是根據某個種子來產生的,就像麥塊的地圖種子一樣,一樣的種子會產生一樣的地圖。在 Python 裡面,可以透過 random.seed()
來設定種子:
>>> random.seed(42)
>>> for i in range(5):
>>> print(random.randint(1, 99))
82
15
4
95
36
將隨機種子設定為 42,這樣這格程式碼不管執行幾次,結果都是一樣的。
根據道格拉斯·亞當斯的小說《銀河便車指南》,42 是「生命、宇宙以及任何事情的終極答案」,因此很常看到有人把隨機種子設定為 42 來致敬這部作品。
my_randint()
,在只使用 random.random()
的情況下,製作出 random.randint()
的效果。完整的程式碼放在此 Colab 裡面供各位參考。